﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace JH
{
    /// <summary>
    /// IEnumerable扩展方法 : 集合中的元素，如果相邻，且符合判断条件，则只留下一个
    /// </summary>
    public static class DistinctAdjacentExtension
    {
        /// <summary>
        /// IEnumerable扩展方法 : 集合中的元素，如果相邻，且符合判断条件，则只留下一个
        /// 例如： {1，1,1，2，2，2，3，4，5，5，4] }  =>  {1,2,3,4,5,4}
        ///  返回新的集合
        /// </summary>
        /// <param name="origin">源集合</param>
        /// <param name="compareFunc">判定条件</param>
        /// <param name="keepFirst">相同元素留下第首个</param>
        /// <typeparam name="T">元素类型</typeparam>
        /// <returns>新的数组</returns>
        public static List<T> DistinctAdjacentByEm<T>(this IEnumerable<T> origin, Func<T, T, bool> compareFunc,
            bool keepFirst = true)
        {
            // 如果输入为null，直接返回null
            if (origin == null) return null;

            // 将输入转换为List，便于索引访问
            var input = origin.ToList();

            // 如果输入为空列表，直接返回
            if (input.Count == 0) return input;

            // 创建结果列表
            var result = new List<T>();

            // 初始化current为第一个元素
            T current = input[0];

            // 初始化startIndex为0，表示当前组的起始位置
            int startIndex = 0;

            // 遍历到input.Count，确保处理最后一组元素
            for (int i = 1; i <= input.Count; i++)
            {
                // 如果到达列表末尾或当前元素与下一个元素不相等
                if (i == input.Count || !compareFunc(current, input[i]))
                {
                    result.Add(input[startIndex]);

                    if (i < input.Count)
                    {
                        // 更新current为新的不同元素
                        current = input[i];

                        // 更新startIndex为新组的起始位置
                        startIndex = i;
                    }
                }
            }

            // 返回结果列表
            return result;
        }
    }
}